package cnn.test.service;

import cnn.topfox.service.SimpleService;
import cnn.user.dao.UserDao;
import cnn.user.entity.UserDTO;
import cnn.user.entity.UserQTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * 流水号生成源码
 * 用户表为例
 */
@Service
@Slf4j
public class KeyBuildService extends SimpleService<UserDao, UserDTO, UserQTO> {
    public void test1() {
        //logger为TopFox声明的日志对象
        //例: 根据UserDTO中字段名id 来获取一个纯 3位数 递增的流水号
        log.debug(
                keyBuild()          //创建一个 KeyBuild对象, 会自动获取当前Service的 UserDTO 对象
                        .getKey("id",3) //参数 id必须是 UserDTO中存在的字段
        );//打印出来的值是 003
    }

    public void test2() {
        log.debug(keyBuild().getKey("id",2));  //打印出来的值是 08
        log.debug(keyBuild().getKey("id",3));  //打印出来的值是 114
        log.debug(keyBuild().getKey("id",4));  //打印出来的值是 2224
    }

    /**
     * 每行数据执行本方法一次,新增和修改的 之前的逻辑写到这里,  如通用的检查, 计算值得处理
     */
    public void test3() {
        //获取一个 带前缀TL 带日期字符(yyMMdd) + 6位数递增的序列号  的流水号
        log.debug(
            keyBuild()
                .setPrefix("TL")           //设置前缀
                .setSuffix("END")          //设置后缀
                .setDateFormat("yyyyMMdd") //设置日期格式
                .getKey("id",3)            //参数依次是  1.字段名  2.序列号长度
        );
    }

    public void test4() {
        log.debug("获得多个流水号");
        //获得多个序列号
        ConcurrentLinkedQueue<String> queue =
                keyBuild("TL", "yyMMdd")        //前缀, 设置日期格式
                        .getKeys("id",  6,  4); //参数依次是  1.字段名  2.序列号长度  3.要获得流水号个数

        // poll 执行一次, 容器 queue里面少一个
        log.debug(queue.poll());//获得第1个序列号
        log.debug(queue.poll());//获得第2个序列号
        log.debug(queue.poll());//获得第3个序列号
        log.debug(queue.poll());//获得第4个序列号
    }

    public void test5() {
        log.debug("获得多个流水号");
        //获得多个序列号
        ConcurrentLinkedQueue<String> queue =
                keyBuild()
                        .setPrefix("TL")            //设置前缀
                        .setDateFormat("yyyyMMdd")  //设置日期格式
                        .getKeys("id",  6,  4);     //参数依次是  1.字段名  2.序列号长度  3.要获得流水号个数

        // poll 执行一次, 容器 queue里面少一个
        log.debug(queue.poll());//获得第1个序列号
        log.debug(queue.poll());//获得第2个序列号
        log.debug(queue.poll());//获得第3个序列号
        log.debug(queue.poll());//获得第4个序列号
    }
}